home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / gui / imwin / emoticons.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  8KB  |  280 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. from traceback import print_exc
  6. from util import Storage as S, tag, plisttype_to_pytype, odict
  7. from collections import defaultdict
  8. from PIL import Image
  9. from os.path import getmtime
  10. import re
  11. from logging import getLogger
  12. log = getLogger('emoticons')
  13. emoticon_loaders = [
  14.     'digsby',
  15.     'pidgin',
  16.     'adium']
  17.  
  18. def is_emoticon_dir(d):
  19.     G = globals()
  20.     for loader in emoticon_loaders:
  21.         if G['is_emoticons_' + loader](d):
  22.             return True
  23.             continue
  24.     
  25.  
  26.  
  27. def is_emoticons_digsby(emoticon_dir):
  28.     emoticons_txt = emoticon_dir / 'emoticons.txt'
  29.     return emoticons_txt.isfile()
  30.  
  31.  
  32. def load_emoticons_digsby(emoticon_dir):
  33.     emoticons_txt = emoticon_dir / 'emoticons.txt'
  34.     if not emoticons_txt.isfile():
  35.         return (None, None)
  36.     
  37.     title = emoticon_dir.name
  38.     emoticons = { }
  39.     bitmaps = odict()
  40.     
  41.     try:
  42.         f = _[2]
  43.         for line in f:
  44.             line = line.strip()
  45.             if line:
  46.                 title = line
  47.                 break
  48.                 continue
  49.             file(emoticons_txt)
  50.         
  51.         for line in f:
  52.             line = line.strip()
  53.             if not line:
  54.                 continue
  55.             
  56.             content = line.split()
  57.             image_filename = content[0]
  58.             smileys = content[1:]
  59.             imgpath = emoticon_dir / image_filename
  60.             if imgpath.exists():
  61.                 for smiley in smileys:
  62.                     emoticons[smiley.encode('xml')] = S(path = imgpath)
  63.                     if imgpath not in bitmaps:
  64.                         bitmaps[imgpath] = [
  65.                             smiley]
  66.                         continue
  67.                     bitmaps[imgpath].append(smiley)
  68.                 
  69.     finally:
  70.         pass
  71.  
  72.     return (emoticons, bitmaps)
  73.  
  74.  
  75. def is_emoticons_pidgin(emoticon_dir):
  76.     return (emoticon_dir / 'theme').isfile()
  77.  
  78.  
  79. def load_emoticons_pidgin(emoticon_dir):
  80.     theme = emoticon_dir / 'theme'
  81.     if not theme.isfile():
  82.         return (None, None)
  83.     
  84.     smileys = defaultdict(list)
  85.     emoticons = { }
  86.     bitmaps = odict()
  87.     
  88.     try:
  89.         f = _[2]
  90.         for line in f:
  91.             if line.count('\t') > 0:
  92.                 seq = filter(None, line.strip().split('\t'))
  93.                 if len(seq) >= 2:
  94.                     (img, smiley) = seq[:2]
  95.                     imgpath = emoticon_dir / img
  96.                     if imgpath.exists():
  97.                         emoticons[smiley.encode('xml')] = S(path = imgpath)
  98.                         if imgpath not in bitmaps:
  99.                             bitmaps[imgpath] = [
  100.                                 smiley]
  101.                         else:
  102.                             bitmaps[imgpath].append(smiley)
  103.                     
  104.                 
  105.             len(seq) >= 2
  106.     finally:
  107.         pass
  108.  
  109.     return (emoticons, bitmaps)
  110.  
  111.  
  112. def is_emoticons_adium(emoticon_dir):
  113.     return (emoticon_dir / 'Emoticons.plist').isfile()
  114.  
  115.  
  116. def load_emoticons_adium(emoticon_dir):
  117.     emoticons_txt = emoticon_dir / 'Emoticons.plist'
  118.     if not emoticons_txt.isfile():
  119.         return (None, None)
  120.     
  121.     
  122.     try:
  123.         f = _[2]
  124.         plist = tag(f.read())
  125.         toplevel = plist._children[0]
  126.         converted = plisttype_to_pytype(toplevel)
  127.         emoticons = { }
  128.         bitmaps = odict()
  129.         for img_name, info in converted['Emoticons'].items():
  130.             smileys = info['Equivalents']
  131.             imgpath = emoticon_dir / img_name
  132.             if imgpath.exists():
  133.                 for smiley in smileys:
  134.                     if not smiley:
  135.                         continue
  136.                     
  137.                     emoticons[smiley.encode('xml')] = S(path = imgpath)
  138.                     if imgpath not in bitmaps:
  139.                         bitmaps[imgpath] = [
  140.                             smiley]
  141.                         continue
  142.                     bitmaps[imgpath].append(smiley)
  143.                 
  144.     finally:
  145.         pass
  146.  
  147.     return (emoticons, bitmaps)
  148.  
  149.  
  150. def get_emoticon_dirs():
  151.     dirs = [
  152.         resdir() / 'emoticons']
  153.     
  154.     try:
  155.         import stdpaths as stdpaths
  156.         userdir = stdpaths.userdata / 'Emoticon Sets'
  157.         if not userdir.isdir():
  158.             userdir.makedirs()
  159.     except Exception:
  160.         print_exc()
  161.  
  162.     dirs.append(userdir)
  163.     return dirs
  164.  
  165.  
  166. def load_emoticons(emoticon_pack = 'default'):
  167.     log.info('load_emoticons: %s', emoticon_pack)
  168.     emoticons = None
  169.     for emoticon_dir in get_emoticon_dirs():
  170.         emoticon_packdir = emoticon_dir / emoticon_pack
  171.         for loader in emoticon_loaders:
  172.             
  173.             try:
  174.                 (emoticons, bitmaps) = globals()['load_emoticons_' + loader](emoticon_packdir)
  175.             except Exception:
  176.                 print_exc()
  177.  
  178.             if emoticons:
  179.                 break
  180.                 continue
  181.         
  182.         if emoticons:
  183.             break
  184.             continue
  185.     
  186.     if not emoticons:
  187.         return (emoticons, { }, [])
  188.     
  189.     emotitems = sorted(emoticons.items(), key = (lambda e: len(e[0])), reverse = True)
  190.     smiley_regex = '|'.join((lambda .0: for smiley, emoticon in .0:
  191. '(?:%s)' % re.escape(smiley))(emotitems))
  192.     patterns = [
  193.         '(?:^|\\s)(%s)(?:\\s|$)']
  194.     compiled_patterns = [ re.compile(r % smiley_regex, re.MULTILINE) for r in patterns ]
  195.     return (emoticons, bitmaps, compiled_patterns)
  196.  
  197. _emoticons = sentinel
  198. _emoticons_pack = sentinel
  199. _bitmaps = None
  200.  
  201. def first_non_none(seq):
  202.     for i, elem in enumerate(seq):
  203.         if elem is not None:
  204.             return i
  205.             continue
  206.     
  207.     raise AssertionError
  208.  
  209.  
  210. def repl(emoticons):
  211.     
  212.     def _repl(m, e = emoticons):
  213.         (x, y) = m.span()
  214.         (i, j) = m.span(1)
  215.         s = m.string
  216.         emot = e[s[i:j]]
  217.         size = imgsize(emot.path)
  218.         emottext = s[i:j].encode('xml')
  219.         replacement = '<img src="%s" width="%d" height="%d" alt="%s" title="%s" />' % (emot.path.url(), size[0], size[1], emottext, emottext)
  220.         return ''.join([
  221.             s[x:i],
  222.             replacement,
  223.             s[j:y]])
  224.  
  225.     return _repl
  226.  
  227.  
  228. def apply_emoticons(s, emoticon_pack = 'default'):
  229.     global _emoticons, _bitmaps, _emoticon_patterns, _emoticons_pack, _bitmaps
  230.     if _emoticons is sentinel or emoticon_pack != _emoticons_pack:
  231.         (_emoticons, _bitmaps, _emoticon_patterns) = load_emoticons(emoticon_pack)
  232.         _emoticons_pack = emoticon_pack
  233.         _bitmaps = list(_bitmaps.items())
  234.     
  235.     for p in _emoticon_patterns:
  236.         s = p.sub(repl(_emoticons), s)
  237.         s = p.sub(repl(_emoticons), s)
  238.     
  239.     return s
  240.  
  241.  
  242. def findsets():
  243.     sets = []
  244.     for d in get_emoticon_dirs():
  245.         for subdir in d.dirs():
  246.             if is_emoticon_dir(subdir):
  247.                 sets.append(subdir)
  248.                 continue
  249.         
  250.     
  251.     return sets
  252.  
  253.  
  254. def imgsize(p, _cache = { }):
  255.     key = (p, getmtime(p))
  256.     
  257.     try:
  258.         return _cache[key]
  259.     except KeyError:
  260.         size = Image.open(p).size
  261.         return _cache.setdefault(key, size)
  262.  
  263.  
  264. if __name__ == '__main__':
  265.     from path import path
  266.     
  267.     def resdir():
  268.         return path('../../../res')
  269.  
  270. else:
  271.     
  272.     def resdir():
  273.         skin = skin
  274.         import gui
  275.         return skin.resourcedir()
  276.  
  277. if __name__ == '__main__':
  278.     print load_emoticons_pidgin(path('../../../res/emoticons/sa'))
  279.  
  280.